home *** CD-ROM | disk | FTP | other *** search
/ The Utilities Experience / The Utilities Experience - Volume 1.iso / software / programmers / source / chnky2plnr / chunky3.s < prev    next >
Text File  |  1978-06-29  |  5KB  |  225 lines

  1. ;
  2. ; Hi James,
  3. ;
  4. ; I suddenly saw how to use eor.l to shave a few more cycles.  Now it's
  5. ; 67.0 cycles/pixel with no nasty tricks.  (Use a7 as another bitplane
  6. ; pointer to get 66.5 cycles/pixel.)  It's still untested.
  7. ;
  8. ; I think I've about reached my limit, unless someone gives me some more
  9. ; clues.
  10. ;
  11. ; Regards, Peter.
  12.  
  13.         xdef    _chunky2planar
  14.  
  15. ;-----------------------------------------------------------------------------
  16. ; chunky2planar:    (new Motorola syntax)
  17. ;  a0 -> chunky pixels
  18. ;  a1 -> plane0 (assume other 7 planes are allocated contiguously)
  19. ; d0-d1/a0-a1 are trashed
  20.  
  21.  
  22. width        equ    320        ; must be a multiple of 8
  23. height        equ    200
  24. plsiz        equ    (width/8)*height
  25.  
  26. _chunky2planar:
  27.  
  28.         movem.l    d2-d7/a2-a6,-(sp)
  29.  
  30. ; set up register constants
  31.  
  32.         move.l    #$0f0f0f0f,d5    ; d5 = constant $0f0f0f0f
  33.         move.l    #$55555555,d6    ; d6 = constant $55555555
  34.         move.l    #$3333cccc,d7    ; d7 = constant $3333cccc
  35.         lea    (plsiz,a1),a2    ; a2 -> plane1 (end of plane0)
  36.  
  37. ; load up (otherwise) unused address registers with bitplane ptrs
  38.  
  39.         movea.l    a2,a3        ; a3 -> plane1
  40.         lea    (2*plsiz,a1),a4    ; a4 -> plane2
  41.         lea    (2*plsiz,a4),a5    ; a5 -> plane4
  42.         lea    (2*plsiz,a5),a6    ; a6 -> plane6
  43.  
  44. ; main loop (starts here) processes 8 chunky pixels at a time
  45.  
  46. mainloop:
  47.  
  48. ; d0 = a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  49.  
  50.         move.l    (a0)+,d0    ; 12 get next 4 chunky pixels in d0
  51.  
  52. ; d1 = e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0 g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  53.  
  54.         move.l    (a0)+,d1    ; 12 get next 4 chunky pixels in d1
  55.  
  56. ; d2 = d0 & 0f0f0f0f
  57. ; d2 = ........a3a2a1a0 ........b3b2b1b0 ........c3c2c1c0 ........d3d2d1d0
  58.  
  59.         move.l    d0,d2        ;  4
  60.         and.l    d5,d2        ;  8 d5=$0f0f0f0f
  61.  
  62. ; d0 ^= d2
  63. ; d0 = a7a6a5a4........ b7b6b5b4........ c7c6c5c4........ d7d6d5d4........
  64.  
  65.         eor.l    d2,d0        ;  8
  66.  
  67. ; d3 = d1 & 0f0f0f0f
  68. ; d3 = ........e3e2e1e0 ........f3f2f1f0 ........g3g2g1g0 ........h3h2h1h0
  69.  
  70.         move.l    d1,d3        ;  4
  71.         and.l    d5,d3        ;  8 d5=$0f0f0f0f
  72.  
  73. ; d1 ^= d3
  74. ; d1 = e7e6e5e4........ f7f6f5f4........ g7g6g5g4........ h7h6h5h4........
  75.  
  76.         eor.l    d3,d1        ;  8
  77.  
  78. ; d2 = (d2 << 4) | d3
  79. ; d2 = a3a2a1a0e3e2e1e0 b3b2b1b0f3f2f1f0 c3c2c1c0g3g2g1g0 d3d2d1d0h3h2h1h0
  80.  
  81.         lsl.l    #4,d2        ; 16
  82.         or.l    d3,d2        ;  8
  83.  
  84. ; d0 = d0 | (d1 >> 4)
  85. ; d0 = a7a6a5a4e7e6e5e4 b7b6b5b4f7f6f5f4 c7c6c5c4g7g6g5g4 d7d6d5d4h7h6h5h4
  86.  
  87.         lsr.l    #4,d1        ; 16
  88.         or.l    d1,d0        ;  8
  89.  
  90. ; d3 = ((d2 & 33330000) << 2) | (swap(d2) & 3333cccc) | ((d2 & 0000cccc) >> 2)
  91. ; d3 = a1a0c1c0e1e0g1g0 b1b0d1d0f1f0h1h0 a3a2c3c2e3e2g3g2 b3b2d3d2f3f2h3h2
  92.  
  93.         move.l    d2,d3        ;  4
  94.         and.l    d7,d3        ;  8 d7=$3333cccc
  95.         move.w    d3,d1        ;  4
  96.         clr.w    d3        ;  4
  97.         lsl.l    #2,d3        ; 12
  98.         lsr.w    #2,d1        ; 10
  99.         or.w    d1,d3        ;  4
  100.         swap    d2        ;  4
  101.         and.l    d7,d2        ;  8 d7=$3333cccc
  102.         or.l    d2,d3        ;  8
  103.  
  104. ; d1 = ((d0 & 33330000) << 2) | (swap(d0) & 3333cccc) | ((d0 & 0000cccc) >> 2)
  105. ; d1 = a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6
  106.  
  107.         move.l    d0,d1        ;  4
  108.         and.l    d7,d1        ;  8 d7=$3333cccc
  109.         move.w    d1,d2        ;  4
  110.         clr.w    d1        ;  4
  111.         lsl.l    #2,d1        ; 12
  112.         lsr.w    #2,d2        ; 10
  113.         or.w    d2,d1        ;  4
  114.         swap    d0        ;  4
  115.         and.l    d7,d0        ;  8 d7=$3333cccc
  116.         or.l    d0,d1        ;  8
  117.  
  118. ; d2 = d1 >> 7
  119. ; d2 = ..............a5 a4c5c4e5e4g5g4b5 b4d5d4f5f4h5h4a7 a6c7c6e7e6g7g6..
  120.  
  121.         move.l    d1,d2        ;  4
  122.         lsr.l    #7,d2        ; 22
  123.  
  124. ; d0 = d1 & 55555555
  125. ; d0 = ..a4..c4..e4..g4 ..b4..d4..f4..h4 ..a6..c6..e6..g6 ..b6..d6..f6..h6
  126.  
  127.         move.l    d1,d0        ;  4
  128.         and.l    d6,d0        ;  8 d6=$55555555
  129.  
  130. ; d1 ^= d0
  131. ; d1 = a5..c5..e5..g5.. b5..d5..f5..h5.. a7..c7..e7..g7.. b7..d7..f7..h7..
  132.  
  133.         eor.l    d0,d1        ;  8
  134.  
  135. ; d4 = d2 & 55555555
  136. ; d4 = ..............a5 ..c5..e5..g5..b5 ..d5..f5..h5..a7 ..c7..e7..g7....
  137.  
  138.         move.l    d2,d4        ;  4
  139.         and.l    d6,d4        ;  8 d6=$55555555
  140.  
  141. ; d2 ^= d4
  142. ; d2 = ................ a4..c4..e4..g4.. b4..d4..f4..h4.. a6..c6..e6..g6..
  143.  
  144.         eor.l    d4,d2        ;  8
  145.  
  146. ; d1 = (d1 | d4) >> 1
  147. ; d1 = ................ a5b5c5d5e5f5g5h5 ................ a7b7c7d7e7f7g7h7
  148.  
  149.         or.l    d4,d1        ;  8
  150.         lsr.l    #1,d1        ; 10
  151.  
  152.         move.b    d1,(plsiz,a6)    ; 12 plane 7
  153.         swap    d1        ;  4
  154.         move.b    d1,(plsiz,a5)    ; 12 plane 5
  155.  
  156. ; d2 |= d0
  157. ; d2 = ................ a4b4c4d4e4f4g4h4 ................ a6b6c6d6e6f6g6h6
  158.  
  159.         or.l    d0,d2        ;  8
  160.  
  161.         move.b    d2,(a6)+    ;  8 plane 6
  162.         swap    d2        ;  4
  163.         move.b    d2,(a5)+    ;  8 plane 4
  164.  
  165. ; d2 = d3 >> 7
  166. ; d2 = ..............a1 a0c1c0e1e0g1g0b1 b0d1d0f1f0h1h0a3 a2c3c2e3e2g3g2..
  167.  
  168.         move.l    d3,d2        ;  4
  169.         lsr.l    #7,d2        ; 22
  170.  
  171. ; d0 = d3 & 55555555
  172. ; d0 = ..a0..c0..e0..g0 ..b0..d0..f0..h0 ..a2..c2..e2..g2 ..b2..d2..f2..h2
  173.  
  174.         move.l    d3,d0        ;  4
  175.         and.l    d6,d0        ;  8 d6=$55555555
  176.  
  177. ; d3 ^= d0
  178. ; d3 = a1..c1..e1..g1.. b1..d1..f1..h1.. a3..c3..e3..g3.. b3..d3..f3..h3..
  179.  
  180.         eor.l    d0,d3        ;  8
  181.  
  182. ; d4 = d2 & 55555555
  183. ; d4 = ..............a1 ..c1..e1..g1..b1 ..d1..f1..h1..a3 ..c3..e3..g3....
  184.  
  185.         move.l    d2,d4        ;  4
  186.         and.l    d6,d4        ;  8 d6=$55555555
  187.  
  188. ; d2 ^= d4
  189. ; d2 = ................ a0..c0..e0..g0.. b0..d0..f0..h0.. a2..c2..e2..g2..
  190.  
  191.         eor.l    d4,d2        ;  8
  192.  
  193. ; d3 = (d3 | d4) >> 1
  194. ; d3 = ................ a1b1c1d1e1f1g1h1 ................ a3b3c3d3e3f3g3h3
  195.  
  196.         or.l    d4,d3        ;  8
  197.         lsr.l    #1,d3        ; 10
  198.  
  199.         move.b    d3,(plsiz,a4)    ; 12 plane 3
  200.         swap    d3        ;  4
  201.         move.b    d3,(a3)+    ;  8 plane 1
  202.  
  203. ; d2 = d2 | d0
  204. ; d2 = ................ a0b0c0d0e0f0g0h0 ................ a2b2c2d2e2f2g2h2
  205.  
  206.         or.l    d0,d2        ;  8
  207.  
  208.         move.b    d2,(a4)+    ;  8 plane 2
  209.         swap    d2        ;  4
  210.         move.b    d2,(a1)+    ;  8 plane 0
  211.  
  212. ; test if finished
  213.  
  214.         cmpa.l    a1,a2        ;  6
  215.         bne.w    mainloop    ; 10    total=536 (67.0 cycles/pixel)
  216.  
  217.         movem.l    (sp)+,d2-d7/a2-a6
  218.  
  219.         rts
  220.  
  221. ;-----------------------------------------------------------------------------
  222.  
  223.         end
  224.  
  225.